Storytelling visual con R

Curso formativo para el PDI. Universidad de Castilla-La Mancha

Gema Fernández-Avilés
Isidro Hidalgo

Unidad 3 La elección de un gráfico efectivo. From data to viz

Agenda

  1. Objetivos de aprendizaje

  2. Resultados esperados

  3. Conceptos clave

  4. ¿Qué hemos aprendido?

1. Objetivos de aprendizaje 🎯

  • Comprender la importancia de la visualización

  • Representaciones con {ggplot2}

2. Resultados esperados 🏆

Hexbin plot (starwars data)

3. Conceptos clave 📃

¿Por qué es importante la visualización? 🖼

“The simple graph has brought more information to the data analyst’s mind than any other device.” — John Tukey

DatasauRus

library(datasauRus)
library(dplyr)

datasaurus_dozen |> 
    group_by(dataset) |> 
    summarize(
      mean_x    = mean(x),
      mean_y    = mean(y),
      std_dev_x = sd(x),
      std_dev_y = sd(y),
      corr_x_y  = cor(x, y)
    )
# A tibble: 13 × 6
  dataset  mean_x mean_y std_dev_x std_dev_y corr_x_y
  <chr>     <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
1 away       54.3   47.8      16.8      26.9  -0.0641
2 bullseye   54.3   47.8      16.8      26.9  -0.0686
3 circle     54.3   47.8      16.8      26.9  -0.0683
4 dino       54.3   47.8      16.8      26.9  -0.0645
5 dots       54.3   47.8      16.8      26.9  -0.0603
6 h_lines    54.3   47.8      16.8      26.9  -0.0617
# ℹ 7 more rows

DatasauRus

Note

Otros ejemplos clásicos son el cuarteto de Anscombe y la paradoja de Simpson.

¿Cómo describirías la relación entre la masa y la altura de los personajes de Starwars?

library(tidyverse)
ggplot(data = starwars, mapping = aes(x = height, y = mass)) +
  geom_point() 

¿Quién es el outlier? Jabba Desilijic Tiure

Imagen adaptada de https://datasciencebox.org

“The grammar of graphics”: {ggplot}

Imagen adaptada de https://datasciencebox.org

  • {ggplot2} es un paquete tidyverse para visualización de datos.

  • gg en ggplot2 hace referencia a Grammar of Graphics.

  • Inspirado en el libro Grammar of Graphics, Wilkinson (2012).

¿Cómo visualizar con la función ggplot() de {ggplot}?

library(ggplot2)
ggplot(data = [dataset], 
       mapping = aes(x = [x-variable], y = [y-variable])) +
   geom_xxx() +
   otras opciones

Ahora, de verdad:

library(ggplot2)
library(dplyr)  #cargamos los datos 'starwars'
# se crea un nuevo data.frame sin el outlier (que se elimina)
starwars2 <- filter(starwars, name != "Jabba Desilijic Tiure")
ggplot(data = starwars2, mapping = aes(x = height, y = mass)) +
  geom_point() +
  labs(title = "Mass vs. height of Starwars characters",
       x = "Height (cm)", y = "Weight (kg)")

Ayuda con ggplot2: ggplot2.tidyverse.org y Cheatsheets.

Mi primer plot con ggplot()

Fuente: Wikipedia

Paso a paso 🐾

Paso a paso:

Empezamos con el data.frame starwars2

ggplot(data = starwars2) 

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x

ggplot(data = starwars2,
       mapping = aes(x = height))

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass)) 

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass)) + 
  geom_point() 

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto
y la variable gender para el color de cada punto

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour = gender)) + 
  geom_point()

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto
y la variable gender para el color de cada punto.
Añadimos título al gráfico: “Mass vs. height of Starwars characters”

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour =gender)) +
  geom_point() +
  labs(title = "Mass vs. height of Starwars characters")

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto
y la variable gender para el color de cada punto.
Añadimos título al gráfico: “Mass vs. height of Starwars characters”
añadimos el subtítulo “by gender”

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour = gender)) +
  geom_point() +
  labs(title = "Mass vs. height of Starwars characters",
       subtitle = "by gender")  

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto
y la variable gender para el color de cada punto.
Añadimos título al gráfico: “Mass vs. height of Starwars characters”
añadimos el subtítulo “Género de los personajes de starwars2”
etiquetamos los ejes x e y como “x =”Height (cm)“, y =”Weight (kg)“, respectivamente

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour = gender)) +
  geom_point() +
  labs(title = "Mass vs. height of Starwars characters",
       subtitle = "by gender",  
       x = "Height (cm)", y = "Weight (kg)")

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto
y la variable gender para el color de cada punto.
Añadimos título al gráfico: “Mass vs. height of Starwars characters”
añadimos el subtítulo “Género de los personajes de starwars2”
etiquetamos los ejes x e y como “x =”Height (cm)“, y =”Weight (kg)“, respectivamente
etiquetamos la leyenda “Species”

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour = gender)) +
  geom_point() +
  labs(title = "Mass vs. height of Starwars characters",
       subtitle = "by gender",  
       x = "Height (cm)", y = "Weight (kg)",
       colour = "Gender") 

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto
y la variable gender para el color de cada punto.
Añadimos título al gráfico: “Mass vs. height of Starwars characters”
añadimos el subtítulo “Género de los personajes de starwars2”
etiquetamos los ejes x e y como “x =”Height (cm)“, y =”Weight (kg)“,
etiquetamos la leyenda”Gender”
añadimos la fuente de los datos.

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour = gender)) +
  geom_point() +
  labs(title = "Mass vs. height of Starwars characters",
       subtitle = "by gender",  
       x = "Height (cm)", y = "Weight (kg)",
       colour = "Gender",
       caption = "Source: dplyr package") 

Paso a paso:

Empezamos con el data.frame starwars2
ponemos height en el eje-x
ponemos mass en el eje-y
representamos cada observación con un punto
y la variable gender para el color de cada punto.
Añadimos título al gráfico: “Mass vs. height of Starwars characters”
añadimos el subtítulo “Género de los personajes de starwars2”
etiquetamos los ejes x e y como “x =”Height (cm)“, y =”Weight (kg)“,
etiquetamos la leyenda”Gender”
añadimos la fuente de los datos.
Finalmente, usamos paleta con una escala de colores discreta que está diseñada para ser percibida por espectadores con formas comunes de daltonismo.

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour = gender)) +
  geom_point() +
  labs(title = "Mass vs. height of Starwars characters",
       subtitle = "by gender",  
       x = "Height (cm)", y = "Weight (kg)",
       colour = "Gender",
       caption = "Source: dplyr package")  +
  scale_colour_viridis_d()

Aesthetics (estética) 🎯

ggplot(data = starwars2,
       mapping = aes(x = height,
                     y = mass,
                     colour = xxxxx,
                     shape = xxxxx,
                     size = xxxxx,
                     alpha = xxxxx)
       ) +
  geom_point() 

¿Cuál es la mejor representación gráfica? 🎯

¿Cómo son mis datos? 🤔

Un mundo de posibilidades 🤔

From data to viz project

Árbol de clasificación de gráficos según el tipo de datos

2. Distribución 🎯

Recursos interesantes

https://r-graph-gallery.com/boxplot.html

The R graph gallery

https://r-charts.com/

R charts

https://exts.ggplot2.tidyverse.org/gallery/

Extensiones {ggplot2}

Nuestra filosofía 📖: learning by doing

  • Recuerda que los ordenadores actualmente no son inteligentes.

  • Filosofía: copy, paste, and tweak

  • La mejor forma de aprender código es haciéndolo.

  • La práctica es la clave

4. Conceptos clave 📖

  • {ggplot2}.

  • geom_xxx().

Referencias

Wilkinson, Leland. 2012. The Grammar of Graphics. Springer.